package com.gitee.feizns.explore.data_structure.linked_list.singly.add;

/**
 * 两数相加
 * 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
 *
 * 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
 *
 * 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 * @author feizns
 * @since 2019/10/9
 */
public class AddTwoNumbers {

    public static void main(String[] args) {
        ListNode node = create1();
        ListNode node1 = create2();
        addTwoNumbers(node1, node).print();
    }

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode prev = new ListNode(-1);
        ListNode curt = prev;
        int crossing = 0;

        while ( l1 != null && l2 != null ) {
            int val = l1.val + l2.val + crossing;
            curt.next = new ListNode(val % 10);
            curt = curt.next;
            crossing = val / 10;
            l1 = l1.next;
            l2 = l2.next;
        }

        while ( l1 != null ) {
            int val = l1.val + crossing;
            curt.next = new ListNode(val % 10);
            curt = curt.next;
            crossing = val / 10;
            l1 = l1.next;
        }

        while ( l2 != null ) {
            int val = l2.val + crossing;
            curt.next = new ListNode(val % 10);
            curt = curt.next;
            crossing = val / 10;
            l2 = l2.next;
        }

        if ( crossing != 0 )
            curt.next = new ListNode(crossing);

        return prev.next;
    }

    public static ListNode create1() {
        ListNode ret = new ListNode(9);
        ret.next = new ListNode(9);
        ret.next.next = new ListNode(9);
        return ret;
    }

    public static ListNode create2() {
        ListNode ret = new ListNode(1);
        ret.next = new ListNode(2);
        ret.next.next = new ListNode(3);
        return ret;
    }

}
